/******************************************************************
 *
 *    Java Lib For JavaWeb, Powered By Zhejiang hangzhou.
 *
 *    Copyright (c) 2001-2020
 *    http://tankpao.tk/
 *
 *    Package:     tk.tankpao.blast.core.aop
 *
 *    Filename:    AopInit.java
 *
 *    Description: TODO(用一句话描述该文件做什么)
 *
 *    Copyright:   Copyright (c) 2001-2020
 *
 *    Company:     tankpao.tk
 *
 *    @author:     王志刚
 *
 *    @version:    1.0.0
 *
 *    Create at:   2017年2月9日 下午3:26:33
 *
 *    Revision:
 *
 *    2017年2月9日 下午3:26:33
 *        - first revision
 *
 *****************************************************************/
package tk.tankpao.blast.core.aop;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.cglib.proxy.Enhancer;
import tk.tankpao.blast.util.PointcutPathUtils;

/**
 * @ClassName AopInit
 * @Description aop基础
 * @author 王志刚
 * @Date 2017年2月9日 下午3:26:33
 * @version 1.0.0
 */
public class AopBaseActor {
	
	public static Map<String, List<Class>> pointcutPathMap = new HashMap<String, List<Class>>();
	
	@SuppressWarnings("rawtypes")
	public static void init(Map<String, Class> aspectMap){
		aspectMap.forEach((pointcutstr, clazz)->{
			String[] pointcuts = pointcutstr.split(",");
			for(String pointcut : pointcuts){
				if(pointcutPathMap.get(pointcut.trim()) == null){
					List<Class> clazzList = new ArrayList<Class>();
					clazzList.add(clazz);
					pointcutPathMap.put(pointcut, clazzList);
				}else{
					pointcutPathMap.get(pointcut.trim()).add(clazz);
				}
			}
		});
	}
	
	@SuppressWarnings("unchecked")
	public static <T> Object enhanceObject(final Object bean, Class<T> clazz){
		List<T> enhanceredBeanList = new ArrayList<T>();
		enhanceredBeanList.add((T)bean);
		pointcutPathMap.forEach((pointcut, list) -> {
			if(PointcutPathUtils.accordPath(pointcut, clazz)){
				list.forEach(enHanceClazz->{
					Enhancer enhancer = new Enhancer();
					enhancer.setSuperclass(clazz);
					BaseInterceptor bi = null;
					try {
						bi = (BaseInterceptor) enHanceClazz.newInstance();
						bi.setTargetObj(enhanceredBeanList.get(enhanceredBeanList.size()-1));
					} catch (Exception e) {
						e.printStackTrace();
						System.exit(0);
					}
					enhancer.setCallback(bi);
					enhancer.setCallbackType(enHanceClazz);
					enhanceredBeanList.add((T) enhancer.create());
				});
			}
		});
		if(clazz.getName().equals("tk.tankpao.blast.core.Tww")){
			System.out.println("sad");
		}
		return enhanceredBeanList.get(enhanceredBeanList.size()-1);
	}

}
